home *** CD-ROM | disk | FTP | other *** search
/ Freelog 55 / Freelog055.iso / Bas / Jeu / 3DBubbleBobble / DBPro Source Code / 3D Bubble Bobble.dba next >
Text File  |  2003-04-06  |  66KB  |  1,815 lines

  1. Rem Project: 3D Bubble Bobble
  2. Rem Created: 06/02/2003 17:58:27
  3.  
  4. Rem ***** Main Source File *****
  5.  
  6. rem **object numbers**
  7. rem 1 - player object
  8. rem 10 to 100 - player 1 bubbles
  9. rem 200 to 249 - enemies
  10. rem 250 to 299 - enemy bullets
  11. rem 300 to 350 - bonus pickups
  12. rem 1000 - level object
  13. rem 1001 to 2000 - level platforms
  14. rem 6000 to 6005 - big bonus objects
  15. rem 7000 to 7100 - mini_bonus objects
  16.  
  17.  
  18. rem **image numbers**
  19. rem 1 - player texture
  20. rem 100 to 150 - enemy textures
  21. rem 1000 to 1005 - level wall/ceiling textures
  22.  
  23. rem program setup
  24. hide mouse
  25. autocam off
  26. color backdrop 0
  27. set ambient light 65
  28. set normalization on
  29. randomize timer()
  30.  
  31. rem player variables
  32. type player
  33.    life as integer
  34.    size_x as integer
  35.    size_y as integer
  36.    size_z as integer
  37.    pos_x as float
  38.    pos_y as float
  39.    pos_z as float
  40.    old_pos_x as float
  41.    old_pos_y as float
  42.    old_pos_z as float
  43.    ang_x as float
  44.    ang_y as float
  45.    speed as float
  46.    jump as float
  47.    jump_angle as float
  48.    control as float
  49.    gravity as float
  50.    animate as integer
  51.    fire_rate as integer
  52.    fire_animation as integer
  53.    death_animation as integer
  54.    invincible as integer
  55.    invincible_timer as integer
  56.    score as integer
  57.    extra_life as integer
  58. endtype
  59. player as player
  60.  
  61. rem player 1 setup
  62. player.life=-1
  63. player.size_x=24
  64. player.size_y=35
  65. player.size_z=32
  66. player.speed=3
  67. player.control=1
  68.  
  69. rem enemy variables
  70. type enemy
  71.    object_num as integer
  72.    enemy_type as integer
  73.    bonus as integer
  74.    life as integer
  75.    trapped as integer
  76.    hit_wall as integer
  77.    size_x as integer
  78.    size_y as integer
  79.    size_z as integer
  80.    pos_x as float
  81.    pos_y as float
  82.    pos_z as float
  83.    old_pos_x as float
  84.    old_pos_y as float
  85.    old_pos_z as float
  86.    ang_y as float
  87.    speed as float
  88.    jump as float
  89.    jump_angle as float
  90.    gravity as float
  91.    animate as integer
  92.    shot as integer
  93.    max_shots as integer
  94.    ai_dest_ang_y as float
  95.    ai_turn_dir as integer
  96.    fire_rate as integer
  97.    animation_speed as integer
  98.    texture_num as integer
  99.    value as integer
  100.    mad as integer
  101.    fly_dir as integer
  102. endtype
  103. dim enemy(15) as enemy
  104.  
  105. type enemy_bullet
  106.    pos_x as float
  107.    pos_y as float
  108.    pos_z as float
  109.    ang_y as float
  110.    life as integer
  111. endtype
  112. dim enemy_bullet(15) as enemy_bullet
  113.  
  114. rem player bubble variables
  115. global max_bubbles
  116. max_bubbles=60
  117. type player_bubble
  118.    pos_x as float
  119.    pos_y as float
  120.    pos_z as float
  121.    old_pos_x as float
  122.    old_pos_y as float
  123.    old_pos_z as float
  124.    ang_x as float
  125.    ang_y as float
  126.    speed as float
  127.    gravity as float
  128.    scale as integer
  129.    life as integer
  130.    enemy_trapped as integer
  131. endtype
  132. dim player_bubble(max_bubbles-1) as player_bubble
  133.  
  134. rem bonus variables
  135. type bonus
  136.    bonus_type as integer
  137.    object_num as integer
  138.    pos_x as float
  139.    pos_y as float
  140.    pos_z as float
  141.    old_pos_x as float
  142.    old_pos_y as float
  143.    old_pos_z as float
  144.    gravity as float
  145.    value as integer
  146.    life as integer
  147.    jump as float
  148.    jump_angle as float
  149. endtype
  150. dim bonus(20) as bonus
  151.  
  152. global bonus_qty
  153. global level_bonus_qty
  154.  
  155. rem moving platform variables
  156. global moving_platform_qty
  157. type moving_platform
  158.    pos_x as float
  159.    pos_y as float
  160.    pos_z as float
  161.    old_pos_x as float
  162.    old_pos_y as float
  163.    old_pos_z as float
  164.    waypoint_qty as integer
  165.    next_waypoint as integer
  166. endtype
  167. dim moving_platform(8) as moving_platform
  168.  
  169. rem moving platform waypoint array (number of platforms, number of way points)
  170. dim platform_wp_x(8,5)
  171. dim platform_wp_y(8,5)
  172. dim platform_wp_z(8,5)
  173.  
  174. rem camera variables
  175. global camx#
  176. global camy#
  177. global camz#
  178.  
  179. rem clickdelay variable
  180. global clickdelay
  181.  
  182. rem enemy quantity varaiable
  183. global enemy_qty
  184. global live_enemies
  185.  
  186. rem level name variable
  187. global level_number
  188. global level_qty
  189. level_qty=12
  190. global level_start_time
  191. global level_timer
  192. global hurry_up
  193. global death_active
  194. global end_level
  195. global level_offset
  196.  
  197. rem load sounds
  198. load 3dsound "media\sounds\pop.wav",1
  199. load sound "media\sounds\jump.wav",2
  200. load sound "media\sounds\baddie_kill.wav",3
  201. load sound "media\sounds\bubble_shoot.wav",4
  202. load sound "media\sounds\bub_die.wav",5
  203. load sound "media\sounds\hurry.wav",6
  204. load sound "media\sounds\bonus.wav",7
  205. load sound "media\sounds\big_bonus.wav",8
  206. load 3dsound "media\sounds\death.wav",9
  207.  
  208. rem load music
  209. load music "media\music\Bubble Bobble New Age Theme.mp3",1
  210.  
  211. rem load player texture
  212. load image "media\characters\bub.bmp",1
  213. rem load bubble texture
  214. load image "media\effects\bubble.bmp",5
  215.  
  216. rem load enemy textures
  217. load image "media\characters\baddie_1.bmp",100
  218. load image "media\characters\baddie_1a.bmp",101
  219. load image "media\characters\baddie_2.bmp",102
  220. load image "media\characters\baddie_2a.bmp",103
  221. load image "media\characters\baddie_3.bmp",104
  222. load image "media\characters\baddie_3a.bmp",105
  223. load image "media\characters\baddie_4.bmp",106
  224. load image "media\characters\baddie_4a.bmp",107
  225.  
  226. rem load other textures
  227. load image "media\effects\cloud.bmp",986
  228. load image "media\effects\fire.bmp",987
  229.  
  230. rem setup player object
  231. load object "media\characters\bub.x",1
  232. texture object 1,1
  233. hide object 1
  234. set object speed 1,100
  235. make object collision box 1,0-(player.size_x/2),0-(player.size_y/2),0-(player.size_z/2),player.size_x/2,player.size_y/2,player.size_z/2,0
  236.  
  237. rem setup player bubble objects
  238. for a=10 to max_bubbles+10
  239.    make object sphere a,10,16,16
  240.    texture object a,5
  241.    ghost object on a
  242.    hide object a
  243.    make object collision box a,-27,-27,-27,27,27,27,0
  244. next a
  245.  
  246. rem setup death ghost object
  247. load object "media\characters\death.x",5
  248. hide object 5
  249.  
  250. rem menu setup
  251. global menu
  252. menu=1
  253. level_number=rnd(level_qty-1)+1
  254. gosub new_level
  255.  
  256. rem scoreboard setup
  257. global line$
  258. global high_score
  259. rem scoreboard arrays
  260. dim scoreboard_name$(9)
  261. dim scoreboard_score(9)
  262. rem set default scoreboard names and scores
  263. scoreboard_name$(0)="Tom"
  264. scoreboard_score(0)=100000
  265. scoreboard_name$(1)="Azazel"
  266. scoreboard_score(1)=75000
  267. scoreboard_name$(2)="Cro"
  268. scoreboard_score(2)=50000
  269. scoreboard_name$(3)="Maz"
  270. scoreboard_score(3)=25000
  271. scoreboard_name$(4)="Karl"
  272. scoreboard_score(4)=20000
  273. scoreboard_name$(5)="Rory"
  274. scoreboard_score(5)=15000
  275. scoreboard_name$(6)="Amy"
  276. scoreboard_score(6)=10000
  277. scoreboard_name$(7)="Bub"
  278. scoreboard_score(7)=5000
  279. scoreboard_name$(8)="Bob"
  280. scoreboard_score(8)=1000
  281. scoreboard_name$(9)="pepe"
  282. scoreboard_score(9)=500
  283. remstart load scores from file
  284. if file exist("scores.dat")>0
  285.    open to read 1,"scores.dat"
  286.       for a=0 to 9
  287.          read string 1,scoreboard_name$(a)
  288.          read file 1,scoreboard_score(a)
  289.       next a
  290.    close file 1
  291. endif
  292. remend
  293.  
  294. rem set sync rate
  295. sync rate 60
  296. sync on
  297.  
  298. play sound 8
  299.  
  300. rem main game loop
  301. do
  302.  
  303.    rem game over
  304.    if game_over>0
  305.       center text screen width()/2,screen height()/2,"Game Over"
  306.       if timer()-game_over>3000
  307.          game_over=0
  308.          menu=1
  309.          rem set camera to follow an enemy for menu
  310.          if enemy(enemy_cam).life<1
  311.             for a=0 to enemy_qty-1
  312.                if enemy(a).life>0
  313.                   enemy_cam=a
  314.                   exit
  315.                endif
  316.             next a
  317.          endif
  318.          rem check if players score is a high score
  319.          for a=0 to 9
  320.             if player.score>scoreboard_score(a)
  321.                high_score=a+1
  322.                menu=0
  323.                clear entry buffer
  324.                exit
  325.             endif
  326.          next a
  327.       endif
  328.    endif
  329.  
  330.    if menu>0 then gosub menu
  331.  
  332.    if high_score>0 then gosub high_score_entry
  333.  
  334.    if player.score>=player.extra_life and player.life>-1
  335.       player.life=player.life+1
  336.       player.extra_life=player.extra_life+100000
  337.       play sound 8
  338.    endif
  339.  
  340.    if hurry_up<1
  341.  
  342.       rem moving platforms control
  343.       if moving_platform_qty>0
  344.          object_num=2000
  345.          for a=0 to moving_platform_qty-1
  346.             moving_platform(a).old_pos_x=object position x(object_num)
  347.             moving_platform(a).old_pos_z=object position z(object_num)
  348.             point object object_num+2,platform_wp_x(a,moving_platform(a).next_waypoint),platform_wp_y(a,moving_platform(a).next_waypoint),platform_wp_z(a,moving_platform(a).next_waypoint)
  349.             move object object_num+2,1
  350.             position object object_num,object position x(object_num+2),object position y(object_num+2),object position z(object_num+2)
  351.             position object object_num+1,object position x(object_num+2),object position y(object_num+2)+10.5,object position z(object_num+2)
  352.             x1#=object position x(object_num+2)
  353.             x2#=platform_wp_x(a,moving_platform(a).next_waypoint)
  354.             y1#=object position y(object_num+2)
  355.             y2#=platform_wp_y(a,moving_platform(a).next_waypoint)
  356.             z1#=object position z(object_num+2)
  357.             z2#=platform_wp_z(a,moving_platform(a).next_waypoint)
  358.             if distance_3d(x1#,x2#,y1#,y2#,z1#,z2#)<5
  359.                moving_platform(a).next_waypoint=moving_platform(a).next_waypoint+1
  360.                if moving_platform(a).next_waypoint>moving_platform(a).waypoint_qty-1 then moving_platform(a).next_waypoint=0
  361.             endif
  362.             inc object_num,3
  363.          next a
  364.       endif
  365.  
  366.          rem hold old player positions
  367.          player.old_pos_x=player.pos_x
  368.          player.old_pos_y=player.pos_y
  369.          player.old_pos_z=player.pos_z
  370.  
  371.          rem player control
  372.          if player.death_animation<1 and player.life>-1
  373.             rem reduce control if player is in air
  374.             if player.gravity<>0
  375.                player.control=2
  376.             else
  377.                player.control=1
  378.             endif
  379.             rem w key to move forward
  380.             if keystate(17)>0
  381.                player.pos_x=newxvalue(player.pos_x,player.ang_y,player.speed/player.control)
  382.                player.pos_z=newzvalue(player.pos_z,player.ang_y,player.speed/player.control)
  383.                if player.animate<1 then player.animate=1
  384.             endif
  385.             rem s key to move back
  386.             if keystate(31)>0
  387.                player.pos_x=newxvalue(player.pos_x,player.ang_y,-player.speed/player.control)
  388.                player.pos_z=newzvalue(player.pos_z,player.ang_y,-player.speed/player.control)
  389.                if player.animate<1 then player.animate=1
  390.             endif
  391.             rem a key to strafe left
  392.             if keystate(30)>0
  393.                player.pos_x=newxvalue(player.pos_x,player.ang_y-90,(player.speed/1.5)/player.control)
  394.                player.pos_z=newzvalue(player.pos_z,player.ang_y-90,(player.speed/1.5)/player.control)
  395.                if player.animate<1 then player.animate=1
  396.             endif
  397.             rem d key to strafe right
  398.             if keystate(32)>0
  399.                player.pos_x=newxvalue(player.pos_x,player.ang_y+90,(player.speed/1.5)/player.control)
  400.                player.pos_z=newzvalue(player.pos_z,player.ang_y+90,(player.speed/1.5)/player.control)
  401.                if player.animate<1 then player.animate=1
  402.             endif
  403.             rem mousemovey to change players x angle
  404.             player.ang_x=wrapvalue(curvevalue(player.ang_x+(mousemovey()*1.5),player.ang_x,5))
  405.             if player.ang_x>45 and player.ang_x<180 then player.ang_x=45
  406.             if player.ang_x>180 and player.ang_x<250 then player.ang_x=250
  407.             rem mousemovex to turn player (y angle)
  408.             player.ang_y=wrapvalue(curvevalue(player.ang_y+(mousemovex()/player.control),player.ang_y,5))
  409.             rem space key to jump
  410.             if spacekey()>0 and player.gravity=0
  411.                player.jump=2.5
  412.                if keystate(17)>0 then player.jump_angle=player.ang_y
  413.                play sound 2
  414.             endif
  415.             rem mouse click to shoot bubble
  416.             if mouseclick()>0 and clickdelay<1 and player.fire_rate<1
  417.                clickdelay=1
  418.                for a=0 to max_bubbles-1
  419.                   if player_bubble(a).life<1
  420.                      player_bubble(a).life=timer()
  421.                      player_bubble(a).pos_x=player.pos_x
  422.                      player_bubble(a).pos_y=player.pos_y
  423.                      player_bubble(a).pos_z=player.pos_z
  424.                      player_bubble(a).old_pos_x=player.pos_x
  425.                      player_bubble(a).old_pos_y=player.pos_y
  426.                      player_bubble(a).old_pos_z=player.pos_z
  427.                      player_bubble(a).ang_y=player.ang_y
  428.                      player_bubble(a).speed=7
  429.                      player_bubble(a).gravity=0
  430.                      player_bubble(a).scale=100
  431.                      player_bubble(a).enemy_trapped=-1
  432.                      player.fire_rate=25
  433.                      player.fire_animation=1
  434.                      rotate limb 1,3,0,0,0
  435.                      show object a+10
  436.                      play sound 4
  437.                      exit
  438.                   endif
  439.                next a
  440.             endif
  441.          endif
  442.  
  443.          rem player fire rate control
  444.          if player.fire_rate>0 then player.fire_rate=player.fire_rate-1
  445.  
  446.          rem player jumping
  447.          if player.jump>0
  448.             inc player.jump,0.5
  449.             if player.jump>4 then player.jump=0
  450.             player.gravity=player.gravity+player.jump
  451.          endif
  452.          if player.gravity<>0 and player.jump_angle>0
  453.             player.pos_x=newxvalue(player.pos_x,player.jump_angle,5)
  454.             player.pos_z=newzvalue(player.pos_z,player.jump_angle,5)
  455.          endif
  456.  
  457.          rem effect gravity on player
  458.          if player.gravity>-25 then player.gravity=player.gravity-0.3
  459.          if player.gravity>-1.2 and player.gravity<0 then player.gravity=-1.2
  460.          player.pos_y=player.pos_y+player.gravity
  461.  
  462.          rem player to level collison
  463.          old_x1#=player.old_pos_x-(player.size_x/2)
  464.          old_y1#=player.old_pos_y-(player.size_y/2)
  465.          old_z1#=player.old_pos_z-(player.size_z/2)
  466.          old_x2#=player.old_pos_x+(player.size_x/2)
  467.          old_y2#=player.old_pos_y+(player.size_y/2)
  468.          old_z2#=player.old_pos_z+(player.size_z/2)
  469.          x1#=player.pos_x-(player.size_x/2)
  470.          y1#=player.pos_y-(player.size_y/2)
  471.          z1#=player.pos_z-(player.size_z/2)
  472.          x2#=player.pos_x+(player.size_x/2)
  473.          y2#=player.pos_y+(player.size_y/2)
  474.          z2#=player.pos_z+(player.size_z/2)
  475.          if get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)>0
  476.             player.pos_x=player.pos_x-get static collision x()
  477.             player.pos_y=player.pos_y-get static collision y()
  478.             player.pos_z=player.pos_z-get static collision z()
  479.             if get static collision y()<0
  480.                player.jump=0
  481.                player.jump_angle=0
  482.                player.gravity=0
  483.             endif
  484.             if get static collision y()>0
  485.                player.jump=0
  486.                player.gravity=-0.1
  487.             endif
  488.          endif
  489.  
  490.          rem player moving platform collision
  491.          object_num=2000
  492.          for a=0 to moving_platform_qty-1
  493.             if object collision(1,object_num)>0
  494.                player.pos_x=player.pos_x-get object collision x()
  495.                player.pos_y=player.pos_y-get object collision y()
  496.                player.pos_z=player.pos_z-get object collision z()
  497.                if get object collision y()<0
  498.                   player.jump=0
  499.                   player.jump_angle=0
  500.                   player.gravity=0
  501.                   player.pos_x=newxvalue(player.pos_x,atanfull(object position x(object_num)-moving_platform(a).old_pos_x,object position z(object_num)-moving_platform(a).old_pos_z),abs(object position x(object_num)-moving_platform(a).old_pos_x))
  502.                   player.pos_z=newzvalue(player.pos_z,atanfull(object position x(object_num)-moving_platform(a).old_pos_x,object position z(object_num)-moving_platform(a).old_pos_z),abs(object position z(object_num)-moving_platform(a).old_pos_z))
  503.                endif
  504.                if get object collision y()>0
  505.                   player.jump=0
  506.                   player.gravity=-0.1
  507.                endif
  508.             endif
  509.             inc object_num,3
  510.          next a
  511.  
  512.          rem reposition player after dropping into warp tunnel
  513.          if player.pos_y<-500
  514.             player.pos_x=level_offset
  515.             player.pos_y=3000
  516.             player.pos_z=0
  517.             player.jump_angle=0
  518.          endif
  519.  
  520.          rem player animation control
  521.          if player.animate=1
  522.             loop object 1,5,25
  523.             player.animate=2
  524.          endif
  525.          if player.animate>1 and keystate(17)<1 and keystate(30)<1 and keystate(31)<1 and keystate(32)<1
  526.             player.animate=0
  527.             play object 1,1,1
  528.          endif
  529.  
  530.          rem player fire animation
  531.          if player.fire_animation>0
  532.             if player.fire_animation<50
  533.                rotate limb 1,3,0,0,limb angle z(1,3)-5
  534.                player.fire_animation=player.fire_animation+5
  535.             endif
  536.             if player.fire_animation>50
  537.                rotate limb 1,3,0,0,limb angle z(1,3)+5
  538.                player.fire_animation=player.fire_animation+5
  539.             endif
  540.             if player.fire_animation>95
  541.                player.fire_animation=0
  542.                rotate limb 1,3,0,0,0
  543.             endif
  544.          endif
  545.  
  546.          rem player death animation
  547.          if player.death_animation>0
  548.             player.ang_y=player.ang_y+10
  549.             player.death_animation=player.death_animation+1
  550.             rem end of death animation
  551.             if player.death_animation>100
  552.                player.death_animation=0
  553.                rem if player has lives left make invincible else gameover
  554.                if player.life>-1
  555.                   player.invincible=2
  556.                   player.invincible_timer=timer()
  557.                   ghost object on 1
  558.                else
  559.                   game_over=timer()
  560.                   rem hide player object
  561.                   hide object 1
  562.                endif
  563.             endif
  564.          endif
  565.  
  566.          rem flash player if invincible
  567.          if player.invincible>1
  568.             if player.invincible=2 then ghost object on 1
  569.             if player.invincible=6 then ghost object off 1
  570.             player.invincible=player.invincible+1
  571.             if player.invincible>8 then player.invincible=2
  572.             if timer()-player.invincible_timer>5000
  573.                player.invincible=0
  574.                ghost object off 1
  575.             endif
  576.          endif
  577.          if menu<1
  578.             rem update player object positions and orientation
  579.             position object 1,player.pos_x,player.pos_y,player.pos_z
  580.             rotate object 1,0,player.ang_y,0
  581.  
  582.             rem position listener
  583.             position listener player.pos_x,player.pos_y,player.pos_z
  584.             rotate listener 0,player.ang_y,0
  585.  
  586.             rem player camera
  587.             if player.death_animation<1
  588.                camx#=curvevalue(newxvalue(object position x(1),player.ang_y,-60),camx#,8)
  589.                camy#=curvevalue(newyvalue(object position y(1)+50,player.ang_x,-60),camy#,5)
  590.                camz#=curvevalue(newzvalue(object position z(1),player.ang_y,-60),camz#,8)
  591.                position camera camx#,camy#,camz#
  592.                point camera newxvalue(object position x(1),player.ang_y,60),newyvalue(object position y(1),player.ang_x,60),newzvalue(object position z(1),player.ang_y,60)
  593.             else
  594.                point camera object position x(1),object position y(1),object position z(1)
  595.             endif
  596.          endif
  597.  
  598.  
  599.       rem death control
  600.       if death_active>0
  601.          point object 5,object position x(1),object position y(1),object position z(1)
  602.          move object 5,1.5
  603.          position sound 9,object position x(5),object position y(5),object position z(5)
  604.          if distance_3d(object position x(1),object position x(5),object position y(1),object position y(5),object position z(1),object position z(5))<20
  605.             player.death_animation=1
  606.             player.life=player.life-1
  607.             level_start_time=timer()
  608.             death_active=0
  609.             hide object 5
  610.             stop sound 9
  611.             play sound 5
  612.          endif
  613.       endif
  614.  
  615.       rem enemy control loop
  616.       for a=0 to enemy_qty-1
  617.          if enemy(a).life>0
  618.             rem hold old enemy positions
  619.             enemy(a).old_pos_x=enemy(a).pos_x
  620.             enemy(a).old_pos_y=enemy(a).pos_y
  621.             enemy(a).old_pos_z=enemy(a).pos_z
  622.  
  623.             rem fire rate control
  624.             if enemy(a).fire_rate>0 then enemy(a).fire_rate=enemy(a).fire_rate-1
  625.  
  626.             if enemy(a).trapped<1
  627.  
  628.                rem enemy ai control
  629.                if enemy(a).enemy_type=1 then basic_ai(a)
  630.                if enemy(a).enemy_type=2 then platform_patrol_ai(a)
  631.                if enemy(a).enemy_type=3 then springer_ai(a)
  632.                if enemy(a).enemy_type=4 then ghost_ai(a)
  633.                if enemy(a).enemy_type=5 then ghost_patrol_ai(a)
  634.                if enemy(a).enemy_type=6 then flying_ghost_ai(a)
  635.  
  636.                rem jumping
  637.                if enemy(a).jump>0
  638.                   inc enemy(a).jump,0.5
  639.                   if enemy(a).jump>4 then enemy(a).jump=0
  640.                   enemy(a).gravity=enemy(a).gravity+enemy(a).jump
  641.                endif
  642.                if enemy(a).gravity<>0 and enemy(a).jump_angle>0
  643.                   enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).jump_angle,5)
  644.                   enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).jump_angle,5)
  645.                endif
  646.  
  647.                rem effect gravity on enemys
  648.                if enemy(a).gravity>-25 then enemy(a).gravity=enemy(a).gravity-0.3
  649.                if enemy(a).gravity>-1.2 and enemy(a).gravity<0 then enemy(a).gravity=-1.2
  650.                enemy(a).pos_y=enemy(a).pos_y+enemy(a).gravity
  651.  
  652.                rem enemy to player collision
  653.                if object hit(enemy(a).object_num,1)>0 and player.invincible<1 and player.life>-1 and player.death_animation<1
  654.                   player.death_animation=1
  655.                   player.life=player.life-1
  656.                   level_start_time=timer()
  657.                   enemy_cam=a
  658.                   if death_active>0
  659.                      death_active=0
  660.                      hide object 5
  661.                      stop sound 9
  662.                   endif
  663.                   play sound 5
  664.                endif
  665.  
  666.                rem enemy to level collison
  667.                old_x1#=enemy(a).old_pos_x-(enemy(a).size_x/2)
  668.                old_y1#=enemy(a).old_pos_y-(enemy(a).size_y/2)
  669.                old_z1#=enemy(a).old_pos_z-(enemy(a).size_z/2)
  670.                old_x2#=enemy(a).old_pos_x+(enemy(a).size_x/2)
  671.                old_y2#=enemy(a).old_pos_y+(enemy(a).size_y/2)
  672.                old_z2#=enemy(a).old_pos_z+(enemy(a).size_z/2)
  673.                x1#=enemy(a).pos_x-(enemy(a).size_x/2)
  674.                y1#=enemy(a).pos_y-(enemy(a).size_y/2)
  675.                z1#=enemy(a).pos_z-(enemy(a).size_z/2)
  676.                x2#=enemy(a).pos_x+(enemy(a).size_x/2)
  677.                y2#=enemy(a).pos_y+(enemy(a).size_y/2)
  678.                z2#=enemy(a).pos_z+(enemy(a).size_z/2)
  679.                if get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)>0
  680.                   if get static collision x()=0 and get static collision z()=0
  681.                      enemy(a).hit_wall=0
  682.                   else
  683.                      enemy(a).hit_wall=1
  684.                   endif
  685.                   enemy(a).pos_x=enemy(a).pos_x-get static collision x()
  686.                   enemy(a).pos_y=enemy(a).pos_y-get static collision y()
  687.                   enemy(a).pos_z=enemy(a).pos_z-get static collision z()
  688.                   if get static collision y()<0
  689.                      enemy(a).jump=0
  690.                      enemy(a).jump_angle=0
  691.                      enemy(a).gravity=0
  692.                      enemy(a).fly_dir=1
  693.                   endif
  694.                   if get static collision y()>0
  695.                      enemy(a).jump=0
  696.                      enemy(a).gravity=-0.1
  697.                      enemy(a).fly_dir=0
  698.                   endif
  699.                endif
  700.  
  701.                rem enemy to moving platform collision
  702.                for b=0 to moving_platform_qty-1
  703.                   if object collision(enemy(a).object_num,b+2000)>0
  704.                      enemy(a).pos_x=enemy(a).pos_x-get object collision x()
  705.                      enemy(a).pos_y=enemy(a).pos_y-get object collision y()
  706.                      enemy(a).pos_z=enemy(a).pos_z-get object collision z()
  707.                      if get object collision y()<0
  708.                         enemy(a).jump=0
  709.                         enemy(a).jump_angle=0
  710.                         enemy(a).gravity=0
  711.                      endif
  712.                      if get object collision y()>0
  713.                         enemy(a).jump=0
  714.                         enemy(a).gravity=-0.1
  715.                      endif
  716.                   endif
  717.                next b
  718.  
  719.                rem reposition enemy if it drops into warp tunnel
  720.                if enemy(a).pos_y<-500
  721.                   enemy(a).pos_x=level_offset
  722.                   enemy(a).pos_y=3000
  723.                   enemy(a).pos_z=0
  724.                   enemy(a).jump_angle=0
  725.                endif
  726.  
  727.             endif
  728.  
  729.             rem update enemy positions and orientation
  730.             position object enemy(a).object_num,enemy(a).pos_x,enemy(a).pos_y,enemy(a).pos_z
  731.             if enemy(a).trapped<1
  732.                rotate object enemy(a).object_num,0,enemy(a).ang_y,0
  733.             else
  734.                turn object left enemy(a).object_num,1.5
  735.                pitch object up enemy(a).object_num,1.5
  736.             endif
  737.          endif
  738.       next a
  739.  
  740.       rem bubbles
  741.       for a=0 to max_bubbles-1
  742.          bubble_code(a)
  743.       next a
  744.  
  745.       rem enemy bullets
  746.       for a=0 to enemy_qty-1
  747.          if enemy_bullet(a).life>0 then enemy_bullet_code(a)
  748.       next a
  749.  
  750.       rem enemy bonuses
  751.       for a=0 to bonus_qty-1
  752.          if bonus(a).life>0 then bonus_control(a)
  753.       next a
  754.  
  755.  
  756.    endif
  757.  
  758.    rem click delay control
  759.    if mouseclick()<1 then clickdelay=0
  760.  
  761.    if menu<1 and high_score<1
  762.       rem display hud
  763.       ink 0,0
  764.       box 0,0,screen width(),20
  765.       ink rgb(255,255,255),0
  766.       text 0,0,"Score: "+str$(player.score)
  767.       center text screen width()/2,0,"Level "+str$(level_number)
  768.       lives=player.life
  769.       if lives<0 then lives=0
  770.       text screen width()-100,0,"lives: "+str$(lives)
  771.  
  772.       rem level timer
  773.       level_timer=timer()-level_start_time
  774.       if level_timer>60000 and live_enemies>0 and hurry_up=0
  775.          hurry_up=timer()
  776.          play sound 6
  777.          stop music 1
  778.       endif
  779.       rem send death after player
  780.       if level_timer>75000 and live_enemies>0 and death_active=0
  781.          death_active=1
  782.          position object 5,level_offset,950,0
  783.          show object 5
  784.          loop sound 9
  785.       endif
  786.       rem hurry up time
  787.       if hurry_up>1
  788.          rem flash hurry up message
  789.          ink rgb(rnd(255),rnd(255),rnd(255)),0
  790.          center text screen width()/2,screen height()/2,"Hurry UP!!"
  791.          if timer()-hurry_up>2000
  792.             hurry_up=-1
  793.             rem make enemies mad
  794.             for a=0 to enemy_qty-1
  795.                if enemy(a).life>0 and enemy(a).mad<1 then make_enemy_mad(a)
  796.             next a
  797.             rem play faster music
  798.             loop music 1
  799.             set music speed 1,120
  800.             rem reset mousemove
  801.             a=mousemovex()
  802.             a=mousemovey()
  803.          endif
  804.       endif
  805.       rem end level time
  806.       if end_level>0 and timer()-end_level>9000
  807.          inc level_number
  808.          if level_number>level_qty then level_number=1
  809.          ink rgb(255,255,255),0
  810.          center text screen width()/2,screen height()/2,"Next Level!"
  811.          sync
  812.          if hurry_up<0 then stop music 1
  813.          gosub new_level
  814.       endif
  815.    endif
  816.  
  817.    rem scroll mist
  818.    if object exist(9000)>0
  819.       scroll object texture 9000,0.0001,0.0001
  820.       scroll object texture 9001,0.0003,0.0005
  821.    endif
  822.  
  823.    sync
  824.  
  825. loop
  826.  
  827.  
  828. function basic_ai(a)
  829.    rem initiate a random chance turn
  830.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0 and rnd(300)<1 then enemy(a).hit_wall=1
  831.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  832.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  833.       ang=rnd(180)-90
  834.       if ang>0
  835.          inc ang,60
  836.          enemy(a).ai_turn_dir=1
  837.       else
  838.          dec ang,60
  839.          enemy(a).ai_turn_dir=2
  840.       endif
  841.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  842.       enemy(a).hit_wall=0
  843.    endif
  844.    rem turn baddie to destination angle
  845.    if enemy(a).ai_turn_dir>0
  846.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  847.          if enemy(a).ai_turn_dir>1
  848.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-3)
  849.          else
  850.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+3)
  851.          endif
  852.       else
  853.          enemy(a).ai_turn_dir=0
  854.       endif
  855.    endif
  856.    rem initiate a random jump
  857.    if rnd(120)<1 and enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  858.       enemy(a).jump=2.5
  859.       enemy(a).jump_angle=enemy(a).ang_y
  860.    endif
  861.    rem move enemy forward
  862.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  863.       enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).ang_y,enemy(a).speed)
  864.       enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).ang_y,enemy(a).speed)
  865.    endif
  866. endfunction
  867.  
  868. function platform_patrol_ai(a)
  869.    rem check if near platform edge
  870.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  871.       old_x1#=enemy(a).pos_x-(enemy(a).size_x/2)
  872.       old_y1#=enemy(a).pos_y-(enemy(a).size_y/2)
  873.       old_z1#=enemy(a).pos_z-(enemy(a).size_z/2)
  874.       old_x2#=enemy(a).pos_x+(enemy(a).size_x/2)
  875.       old_y2#=enemy(a).pos_y+(enemy(a).size_y/2)
  876.       old_z2#=enemy(a).pos_z+(enemy(a).size_z/2)
  877.       x1#=newxvalue(enemy(a).pos_x,enemy(a).ang_y,(enemy(a).speed*40))-(enemy(a).size_x/2)
  878.       y1#=enemy(a).pos_y-(enemy(a).size_y/2)-1
  879.       z1#=newzvalue(enemy(a).pos_z,enemy(a).ang_y,(enemy(a).speed*40))-(enemy(a).size_z/2)
  880.       x2#=newxvalue(enemy(a).pos_x,enemy(a).ang_y,(enemy(a).speed*40))+(enemy(a).size_x/2)
  881.       y2#=enemy(a).pos_y+(enemy(a).size_y/2)-1
  882.       z2#=newzvalue(enemy(a).pos_z,enemy(a).ang_y,(enemy(a).speed*40))+(enemy(a).size_z/2)
  883.       hit=get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)
  884.       if get static collision y()=0 then enemy(a).hit_wall=1
  885.    endif
  886.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  887.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  888.       ang=rnd(180)-90
  889.       if ang>0
  890.          inc ang,60
  891.          enemy(a).ai_turn_dir=1
  892.       else
  893.          dec ang,60
  894.          enemy(a).ai_turn_dir=2
  895.       endif
  896.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  897.    endif
  898.    rem turn baddie to destination angle
  899.    if enemy(a).ai_turn_dir>0
  900.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  901.          if enemy(a).ai_turn_dir>1
  902.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-3)
  903.          else
  904.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+3)
  905.          endif
  906.       else
  907.          enemy(a).ai_turn_dir=0
  908.       endif
  909.    endif
  910.    rem move enemy forward
  911.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  912.       enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).ang_y,enemy(a).speed)
  913.       enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).ang_y,enemy(a).speed)
  914.    endif
  915. endfunction
  916.  
  917. function springer_ai(a)
  918.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  919.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  920.       ang=rnd(180)-90
  921.       if ang>0
  922.          inc ang,60
  923.          enemy(a).ai_turn_dir=1
  924.       else
  925.          dec ang,60
  926.          enemy(a).ai_turn_dir=2
  927.       endif
  928.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  929.    endif
  930.    rem turn baddie to destination angle
  931.    if enemy(a).ai_turn_dir>0
  932.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  933.          if enemy(a).ai_turn_dir>1
  934.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-5)
  935.          else
  936.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+5)
  937.          endif
  938.       else
  939.          enemy(a).ai_turn_dir=0
  940.       endif
  941.    endif
  942.    rem initiate a random jump
  943.    if enemy(a).gravity=0
  944.       enemy(a).jump=2
  945.       enemy(a).jump_angle=enemy(a).ang_y
  946.    endif
  947.    rem move enemy forward
  948.    if enemy(a).gravity=0
  949.       enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).ang_y,enemy(a).speed)
  950.       enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).ang_y,enemy(a).speed)
  951.    endif
  952. endfunction
  953.  
  954. function ghost_ai(a)
  955.    rem shoot
  956.    if enemy(a).gravity>=0 and rnd(100)<1 and enemy_bullet(a).life<1
  957.       show object enemy(a).object_num+50
  958.       enemy_bullet(a).pos_x=enemy(a).pos_x
  959.       enemy_bullet(a).pos_y=enemy(a).pos_y
  960.       enemy_bullet(a).pos_z=enemy(a).pos_z
  961.       enemy_bullet(a).ang_y=enemy(a).ang_y
  962.       enemy_bullet(a).life=999
  963.    endif
  964.    rem initiate a random chance turn
  965.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0 and rnd(300)<1 then enemy(a).hit_wall=1
  966.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  967.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  968.       ang=rnd(180)-90
  969.       if ang>0
  970.          inc ang,60
  971.          enemy(a).ai_turn_dir=1
  972.       else
  973.          dec ang,60
  974.          enemy(a).ai_turn_dir=2
  975.       endif
  976.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  977.       enemy(a).hit_wall=0
  978.    endif
  979.    rem turn baddie to destination angle
  980.    if enemy(a).ai_turn_dir>0
  981.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  982.          if enemy(a).ai_turn_dir>1
  983.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-3)
  984.          else
  985.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+3)
  986.          endif
  987.       else
  988.          enemy(a).ai_turn_dir=0
  989.       endif
  990.    endif
  991.    rem initiate a random jump
  992.    if rnd(120)<1 and enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  993.       enemy(a).jump=2.5
  994.       enemy(a).jump_angle=enemy(a).ang_y
  995.    endif
  996.    rem move enemy forward
  997.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  998.       enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).ang_y,enemy(a).speed)
  999.       enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).ang_y,enemy(a).speed)
  1000.    endif
  1001. endfunction
  1002.  
  1003. function ghost_patrol_ai(a)
  1004.    rem shoot
  1005.    if enemy(a).gravity>=0 and rnd(100)<1 and enemy_bullet(a).life<1
  1006.       show object enemy(a).object_num+50
  1007.       enemy_bullet(a).pos_x=enemy(a).pos_x
  1008.       enemy_bullet(a).pos_y=enemy(a).pos_y
  1009.       enemy_bullet(a).pos_z=enemy(a).pos_z
  1010.       enemy_bullet(a).ang_y=enemy(a).ang_y
  1011.       enemy_bullet(a).life=999
  1012.    endif
  1013.    rem check if near platform edge
  1014.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  1015.       old_x1#=enemy(a).pos_x-(enemy(a).size_x/2)
  1016.       old_y1#=enemy(a).pos_y-(enemy(a).size_y/2)
  1017.       old_z1#=enemy(a).pos_z-(enemy(a).size_z/2)
  1018.       old_x2#=enemy(a).pos_x+(enemy(a).size_x/2)
  1019.       old_y2#=enemy(a).pos_y+(enemy(a).size_y/2)
  1020.       old_z2#=enemy(a).pos_z+(enemy(a).size_z/2)
  1021.       x1#=newxvalue(enemy(a).pos_x,enemy(a).ang_y,(enemy(a).speed*40))-(enemy(a).size_x/2)
  1022.       y1#=enemy(a).pos_y-(enemy(a).size_y/2)-1
  1023.       z1#=newzvalue(enemy(a).pos_z,enemy(a).ang_y,(enemy(a).speed*40))-(enemy(a).size_z/2)
  1024.       x2#=newxvalue(enemy(a).pos_x,enemy(a).ang_y,(enemy(a).speed*40))+(enemy(a).size_x/2)
  1025.       y2#=enemy(a).pos_y+(enemy(a).size_y/2)-1
  1026.       z2#=newzvalue(enemy(a).pos_z,enemy(a).ang_y,(enemy(a).speed*40))+(enemy(a).size_z/2)
  1027.       hit=get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)
  1028.       if get static collision y()=0 then enemy(a).hit_wall=1
  1029.    endif
  1030.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  1031.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  1032.       ang=rnd(180)-90
  1033.       if ang>0
  1034.          inc ang,60
  1035.          enemy(a).ai_turn_dir=1
  1036.       else
  1037.          dec ang,60
  1038.          enemy(a).ai_turn_dir=2
  1039.       endif
  1040.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  1041.       enemy(a).hit_wall=0
  1042.    endif
  1043.    rem turn baddie to destination angle
  1044.    if enemy(a).ai_turn_dir>0
  1045.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  1046.          if enemy(a).ai_turn_dir>1
  1047.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-3)
  1048.          else
  1049.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+3)
  1050.          endif
  1051.       else
  1052.          enemy(a).ai_turn_dir=0
  1053.       endif
  1054.    endif
  1055.    rem move enemy forward
  1056.    if enemy(a).gravity=0 and enemy(a).ai_turn_dir=0
  1057.       enemy(a).pos_x=newxvalue(enemy(a).pos_x,enemy(a).ang_y,enemy(a).speed)
  1058.       enemy(a).pos_z=newzvalue(enemy(a).pos_z,enemy(a).ang_y,enemy(a).speed)
  1059.    endif
  1060. endfunction
  1061.  
  1062. function flying_ghost_ai(a)
  1063.    rem make enemy fly up or down
  1064.    if enemy(a).fly_dir>0
  1065.       enemy(a).gravity=1
  1066.    else
  1067.       enemy(a).gravity=-1
  1068.    endif
  1069.    rem if baddie is hitting a wall apply a destination y angle for him to turn to and a turn direction
  1070.    if enemy(a).hit_wall>0 and enemy(a).ai_turn_dir=0
  1071.       ang=rnd(180)-90
  1072.       if ang>0
  1073.          inc ang,60
  1074.          enemy(a).ai_turn_dir=1
  1075.       else
  1076.          dec ang,60
  1077.          enemy(a).ai_turn_dir=2
  1078.       endif
  1079.       enemy(a).ai_dest_ang_y=wrapvalue(enemy(a).ang_y+ang)
  1080.       enemy(a).hit_wall=0
  1081.    endif
  1082.    rem turn baddie to destination angle
  1083.    if enemy(a).ai_turn_dir>0
  1084.       if wrapvalue(enemy(a).ai_dest_ang_y-enemy(a).ang_y)>5
  1085.          if enemy(a).ai_turn_dir>1
  1086.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y-3)
  1087.          else
  1088.             enemy(a).ang_y=wrapvalue(enemy(a).ang_y+3)
  1089.          endif
  1090.       else
  1091.          enemy(a).ai_turn_dir=0
  1092.       endif
  1093.    endif
  1094.    rem move enemy forward
  1095.    if enemy(a).ai_turn_dir=0
  1096.       move object enemy(a).object_num,enemy(a).speed
  1097.       enemy(a).pos_x=object position x(enemy(a).object_num)
  1098.       enemy(a).pos_z=object position z(enemy(a).object_num)
  1099.    endif
  1100. endfunction
  1101.  
  1102. function make_enemy_mad(a)
  1103.    rem speed up enemy and retexture them
  1104.    enemy(a).mad=1
  1105.    enemy(a).speed=enemy(a).speed*2
  1106.    set object speed enemy(a).object_num,enemy(a).animation_speed*2
  1107.    texture object enemy(a).object_num,enemy(a).texture_num+1
  1108. endfunction
  1109.  
  1110.  
  1111. function bubble_code(bubble_num)
  1112.  
  1113.    if player_bubble(bubble_num).life>0
  1114.  
  1115.       bubble_obj_num=bubble_num+10
  1116.  
  1117.       rem bubble to enemy enemy collision
  1118.       if player_bubble(bubble_num).speed>3 and player_bubble(bubble_num).enemy_trapped<0
  1119.          for a=0 to enemy_qty-1
  1120.              rem trapping nearby enemy in bubble
  1121.              if enemy(a).trapped<1 and enemy(a).life>0
  1122.                 if distance_3d(player_bubble(bubble_num).pos_x,enemy(a).pos_x,player_bubble(bubble_num).pos_y,enemy(a).pos_y,player_bubble(bubble_num).pos_z,enemy(a).pos_z)<32
  1123.                    enemy(a).trapped=1
  1124.                    player_bubble(bubble_num).enemy_trapped=a
  1125.                    player_bubble(bubble_num).scale=495
  1126.                    play object enemy(a).object_num,0,0
  1127.                    exit
  1128.                 endif
  1129.              endif
  1130.          next enemy
  1131.       endif
  1132.  
  1133.       rem bubble to player collision
  1134.       if object collision(bubble_obj_num,1)>0
  1135.          rem burst bubble if player jumps up into it
  1136.          if player.gravity>0 and player_bubble(bubble_num).pos_y>player.pos_y
  1137.             player.score=player.score+10
  1138.             player_bubble(bubble_num).life=0
  1139.          endif
  1140.          rem jump if space is pressed and player drops on bubble or else burst
  1141.          if player.gravity<0 and player_bubble(bubble_num).pos_y<player.pos_y
  1142.             player.score=player.score+10
  1143.             if spacekey()>0 and player.pos_y<950
  1144.                player.jump=2.5
  1145.                play sound 2
  1146.                if keystate(17)>0
  1147.                   player.jump_angle=player.ang_y
  1148.                else
  1149.                   player.jump_angle=0
  1150.                endif
  1151.             else
  1152.                player_bubble(bubble_num).life=0
  1153.             endif
  1154.          endif
  1155.          rem kill trapped badguy
  1156.          if player_bubble(bubble_num).life=0 and player_bubble(bubble_num).enemy_trapped>-1
  1157.             rem score for killing enemy
  1158.             player.score=player.score+enemy(player_bubble(bubble_num).enemy_trapped).value
  1159.             rem double score for killing mad enemy
  1160.             if enemy(player_bubble(bubble_num).enemy_trapped).mad>0 then player.score=player.score+enemy(player_bubble(bubble_num).enemy_trapped).value
  1161.             enemy(player_bubble(bubble_num).enemy_trapped).life=0
  1162.             hide object enemy(player_bubble(bubble_num).enemy_trapped).object_num
  1163.             dec live_enemies
  1164.             rem make last enemy mad
  1165.             if live_enemies=1
  1166.                for a=0 to enemy_qty-1
  1167.                   if enemy(a).life>0 and enemy(a).mad<1 then make_enemy_mad(a)
  1168.                next a
  1169.             endif
  1170.             rem if all enemies are dead trigger end of level procedure
  1171.             if live_enemies<1
  1172.                rem set end level timer
  1173.                end_level=timer()
  1174.                rem busrt all bubbles
  1175.                for a=0 to max_bubbles-1
  1176.                   player_bubble(a).life=1
  1177.                next a
  1178.                rem deactivate death if active
  1179.                if death_active>0
  1180.                   death_active=0
  1181.                   hide object 5
  1182.                   stop sound 9
  1183.                endif
  1184.                rem activate level complete bonuses
  1185.                for bonus=level_bonus_qty to level_bonus_qty+7
  1186.                    bonus(bonus).life=1
  1187.                    bonus(bonus).pos_x=level_offset
  1188.                    bonus(bonus).pos_y=550
  1189.                    bonus(bonus).pos_z=0
  1190.                    bonus(bonus).jump=(rnd(10)+2)/10
  1191.                    bonus(bonus).jump_angle=rnd(359)
  1192.                    show object bonus(bonus).object_num
  1193.                next bonus
  1194.             endif
  1195.             rem activate bonus pickup
  1196.             a=enemy(player_bubble(bubble_num).enemy_trapped).bonus
  1197.             bonus(a).life=1
  1198.             show object bonus(a).object_num
  1199.             bonus(a).pos_x=player_bubble(bubble_num).pos_x
  1200.             bonus(a).pos_y=player_bubble(bubble_num).pos_y
  1201.             bonus(a).pos_z=player_bubble(bubble_num).pos_z
  1202.             bonus(a).jump=2.5
  1203.             bonus(a).jump_angle=rnd(359)
  1204.             play sound 3
  1205.          endif
  1206.       endif
  1207.  
  1208.       rem decrease speed of bubble
  1209.       if player_bubble(bubble_num).speed>0 then dec player_bubble(bubble_num).speed,0.05
  1210.  
  1211.       rem scale bubble
  1212.       if player_bubble(bubble_num).scale<500
  1213.          inc player_bubble(bubble_num).scale,5
  1214.          scale object bubble_obj_num,player_bubble(bubble_num).scale,player_bubble(bubble_num).scale,player_bubble(bubble_num).scale
  1215.       endif
  1216.  
  1217.       rem update bubble x,z positions
  1218.       player_bubble(bubble_num).pos_x=newxvalue(player_bubble(bubble_num).pos_x,player_bubble(bubble_num).ang_y,player_bubble(bubble_num).speed)
  1219.       player_bubble(bubble_num).pos_z=newzvalue(player_bubble(bubble_num).pos_z,player_bubble(bubble_num).ang_y,player_bubble(bubble_num).speed)
  1220.  
  1221.       rem gravity float bubble
  1222.       if player_bubble(bubble_num).enemy_trapped>-1
  1223.          max_gavity=2
  1224.       else
  1225.          max_gavity=4
  1226.       endif
  1227.       if player_bubble(bubble_num).gravity<max_gavity then player_bubble(bubble_num).gravity=player_bubble(bubble_num).gravity+0.02
  1228.       player_bubble(bubble_num).pos_y=player_bubble(bubble_num).pos_y+player_bubble(bubble_num).gravity
  1229.  
  1230.       rem warp tunnel
  1231.       if player_bubble(bubble_num).pos_y>1500
  1232.          player_bubble(bubble_num).pos_x=level_offset
  1233.          player_bubble(bubble_num).pos_y=-500
  1234.          player_bubble(bubble_num).pos_z=0
  1235.       endif
  1236.  
  1237.       rem bubble to level collision
  1238.       if get static collision hit(player_bubble(bubble_num).old_pos_x-27,player_bubble(bubble_num).old_pos_y-27,player_bubble(bubble_num).old_pos_z-27,player_bubble(bubble_num).old_pos_x+27,player_bubble(bubble_num).old_pos_y+27,player_bubble(bubble_num).old_pos_z+27,player_bubble(bubble_num).pos_x-27,player_bubble(bubble_num).pos_y-27,player_bubble(bubble_num).pos_z-27,player_bubble(bubble_num).pos_x+27,player_bubble(bubble_num).pos_y+27,player_bubble(bubble_num).pos_z+27)>0
  1239.          player_bubble(bubble_num).pos_x=player_bubble(bubble_num).pos_x-get static collision x()
  1240.          player_bubble(bubble_num).pos_y=player_bubble(bubble_num).pos_y-get static collision y()
  1241.          player_bubble(bubble_num).pos_z=player_bubble(bubble_num).pos_z-get static collision z()
  1242.          rem give bubble some speed so it moves along under platforms and ceiling when collision occurs
  1243.          if get static collision y()>0 then player_bubble(bubble_num).speed=0.5
  1244.          rem if bubble is close to ceiling then re-orientate bubble towards centre
  1245.          if player_bubble(bubble_num).pos_y>900
  1246.             point object bubble_obj_num,0+level_offset,player_bubble(bubble_num).pos_y,0
  1247.             player_bubble(bubble_num).ang_y=object angle y(bubble_obj_num)
  1248.          endif
  1249.       endif
  1250.  
  1251.       rem bubble to moving platform collision
  1252.       for b=0 to moving_platform_qty-1
  1253.          if object collision(bubble_obj_num,b+2000)>0
  1254.             player_bubble(bubble_num).pos_x=player_bubble(bubble_num).pos_x-get object collision x()
  1255.             player_bubble(bubble_num).pos_y=player_bubble(bubble_num).pos_y-get object collision y()
  1256.             player_bubble(bubble_num).pos_z=player_bubble(bubble_num).pos_z-get object collision z()
  1257.             if get object collision y()>0 then player_bubble(bubble_num).speed=0.5
  1258.          endif
  1259.       next b
  1260.  
  1261.  
  1262.       rem hold old bubble positions
  1263.       player_bubble(bubble_num).old_pos_x=player_bubble(bubble_num).pos_x
  1264.       player_bubble(bubble_num).old_pos_y=player_bubble(bubble_num).pos_y
  1265.       player_bubble(bubble_num).old_pos_z=player_bubble(bubble_num).pos_z
  1266.  
  1267.       rem position bubble object
  1268.       position object bubble_obj_num,player_bubble(bubble_num).pos_x,player_bubble(bubble_num).pos_y,player_bubble(bubble_num).pos_z
  1269.       rem rotate bubble
  1270.       turn object left bubble_obj_num,2
  1271.       pitch object up bubble_obj_num,2
  1272.       rem position trapped enemy in bubble
  1273.       if player_bubble(bubble_num).enemy_trapped>-1
  1274.          enemy(player_bubble(bubble_num).enemy_trapped).pos_x=player_bubble(bubble_num).pos_x
  1275.          enemy(player_bubble(bubble_num).enemy_trapped).pos_y=player_bubble(bubble_num).pos_y
  1276.          enemy(player_bubble(bubble_num).enemy_trapped).pos_z=player_bubble(bubble_num).pos_z
  1277.       endif
  1278.  
  1279.       rem burst bubble if bubble life runs high
  1280.       if timer()-player_bubble(bubble_num).life>30000 then player_bubble(bubble_num).life=0
  1281.  
  1282.       rem free any trapped baddies
  1283.       if player_bubble(bubble_num).life<1
  1284.          hide object bubble_obj_num
  1285.          position sound 1,player_bubble(bubble_num).pos_x,player_bubble(bubble_num).pos_y,player_bubble(bubble_num).pos_z
  1286.          play sound 1
  1287.          if player_bubble(bubble_num).enemy_trapped>-1
  1288.             rem change platform patrol ai to basic ai
  1289.             if enemy(player_bubble(bubble_num).enemy_trapped).enemy_type=2 then enemy(player_bubble(bubble_num).enemy_trapped).enemy_type=1
  1290.             if enemy(player_bubble(bubble_num).enemy_trapped).enemy_type=5 then enemy(player_bubble(bubble_num).enemy_trapped).enemy_type=4
  1291.             rem loop animation on freed enemy
  1292.             if enemy(player_bubble(bubble_num).enemy_trapped).enemy_type<3 or enemy(player_bubble(bubble_num).enemy_trapped).enemy_type=4 then loop object enemy(player_bubble(bubble_num).enemy_trapped).object_num,0,20
  1293.             enemy(player_bubble(bubble_num).enemy_trapped).trapped=0
  1294.             if enemy(player_bubble(bubble_num).enemy_trapped).mad<1 then make_enemy_mad(player_bubble(bubble_num).enemy_trapped)
  1295.             player_bubble(bubble_num).enemy_trapped=-1
  1296.          endif
  1297.       endif
  1298.  
  1299.    endif
  1300.  
  1301. endfunction
  1302.  
  1303. function enemy_bullet_code(a)
  1304.    rem update bullet position
  1305.    enemy_bullet(a).pos_x=newxvalue(enemy_bullet(a).pos_x,enemy_bullet(a).ang_y,6)
  1306.    enemy_bullet(a).pos_z=newzvalue(enemy_bullet(a).pos_z,enemy_bullet(a).ang_y,6)
  1307.    position object enemy(a).object_num+50,enemy_bullet(a).pos_x,enemy_bullet(a).pos_y,enemy_bullet(a).pos_z
  1308.    rem rotate enemy bullet
  1309.    turn object left enemy(a).object_num+50,6
  1310.    pitch object up enemy(a).object_num+50,6
  1311.    enemy_bullet(a).life=enemy_bullet(a).life-1
  1312.    rem bullet to player collision
  1313.    if object hit(enemy(a).object_num+50,1)>0 and player.invincible<1 and player.life>-1 and player.death_animation<1
  1314.       player.death_animation=1
  1315.       player.invincible=1
  1316.       player.life=player.life-1
  1317.       level_start_time=timer()
  1318.       play sound 5
  1319.    endif
  1320.    rem bullet to level collision
  1321.    old_x1#=enemy_bullet(a).pos_x-5
  1322.    old_y1#=enemy_bullet(a).pos_y-5
  1323.    old_z1#=enemy_bullet(a).pos_z-5
  1324.    old_x2#=enemy_bullet(a).pos_x+5
  1325.    old_y2#=enemy_bullet(a).pos_y+5
  1326.    old_z2#=enemy_bullet(a).pos_z+5
  1327.    x1#=enemy_bullet(a).pos_x-5
  1328.    y1#=enemy_bullet(a).pos_y-5
  1329.    z1#=enemy_bullet(a).pos_z-5
  1330.    x2#=enemy_bullet(a).pos_x+5
  1331.    y2#=enemy_bullet(a).pos_y+5
  1332.    z2#=enemy_bullet(a).pos_z+5
  1333.    if get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)>0 then enemy_bullet(a).life=0
  1334.    rem hide bullet object if dead
  1335.    if enemy_bullet(a).life<1 then hide object enemy(a).object_num+50
  1336. endfunction
  1337.  
  1338. function bonus_control(a)
  1339.  
  1340.    rem hold old bonus positions
  1341.    bonus(a).old_pos_x=bonus(a).pos_x
  1342.    bonus(a).old_pos_y=bonus(a).pos_y
  1343.    bonus(a).old_pos_z=bonus(a).pos_z
  1344.  
  1345.  
  1346.    rem jumping
  1347.    if bonus(a).bonus_type<1
  1348.       if bonus(a).jump>0
  1349.          inc bonus(a).jump,0.5
  1350.          if bonus(a).jump>4.5 then bonus(a).jump=0
  1351.          bonus(a).gravity=bonus(a).gravity+bonus(a).jump
  1352.       endif
  1353.       if bonus(a).gravity<>0
  1354.          bonus(a).pos_x=newxvalue(bonus(a).pos_x,bonus(a).jump_angle,5)
  1355.          bonus(a).pos_z=newzvalue(bonus(a).pos_z,bonus(a).jump_angle,5)
  1356.       endif
  1357.    endif
  1358.  
  1359.    rem effect gravity on enemys
  1360.    if bonus(a).gravity>-25 then bonus(a).gravity=bonus(a).gravity-0.3
  1361.    bonus(a).pos_y=bonus(a).pos_y+bonus(a).gravity
  1362.  
  1363.    rem bonus to player collision
  1364.    if object collision(bonus(a).object_num,1)>0 and bonus(a).jump=0
  1365.       bonus(a).life=0
  1366.       player.score=player.score+bonus(a).value
  1367.       if bonus(a).bonus_type<1
  1368.          play sound 7
  1369.       else
  1370.          play sound 8
  1371.       endif
  1372.    endif
  1373.  
  1374.    rem bonus to level collison
  1375.    old_x1#=bonus(a).old_pos_x-12
  1376.    old_y1#=bonus(a).old_pos_y-12
  1377.    old_z1#=bonus(a).old_pos_z-12
  1378.    old_x2#=bonus(a).old_pos_x+12
  1379.    old_y2#=bonus(a).old_pos_y+12
  1380.    old_z2#=bonus(a).old_pos_z+12
  1381.    x1#=bonus(a).pos_x-12
  1382.    y1#=bonus(a).pos_y-12
  1383.    z1#=bonus(a).pos_z-12
  1384.    x2#=bonus(a).pos_x+12
  1385.    y2#=bonus(a).pos_y+12
  1386.    z2#=bonus(a).pos_z+12
  1387.    if get static collision hit(old_x1#,old_y1#,old_z1#,old_x2#,old_y2#,old_z2#,x1#,y1#,z1#,x2#,y2#,z2#)>0
  1388.       bonus(a).pos_x=bonus(a).pos_x-get static collision x()
  1389.       bonus(a).pos_y=bonus(a).pos_y-get static collision y()
  1390.       bonus(a).pos_z=bonus(a).pos_z-get static collision z()
  1391.       if get static collision y()<0
  1392.          bonus(a).jump=0
  1393.          bonus(a).jump_angle=0
  1394.          bonus(a).gravity=0
  1395.       endif
  1396.       if get static collision y()>0
  1397.          bonus(a).jump=0
  1398.          bonus(a).gravity=-0.1
  1399.       endif
  1400.    endif
  1401.  
  1402.    rem reposition bonus if it drops into warp tunnel
  1403.    if bonus(a).pos_y<-500
  1404.       bonus(a).pos_x=level_offset
  1405.       bonus(a).pos_y=3000
  1406.       bonus(a).pos_z=0
  1407.       bonus(a).jump_angle=0
  1408.    endif
  1409.  
  1410.    rem position bonus object
  1411.    position object bonus(a).object_num,bonus(a).pos_x,bonus(a).pos_y,bonus(a).pos_z
  1412.  
  1413.    rem hide bonus if it dies
  1414.    if bonus(a).life<1 then hide object bonus(a).object_num
  1415.  
  1416. endfunction
  1417.  
  1418. rem level creation function
  1419. new_level:
  1420.  
  1421.    level_offset=level_offset+2000
  1422.  
  1423.    rem delete level objects
  1424.    for a=1000 to 1050
  1425.       if object exist(a)>0 then delete object a
  1426.    next a
  1427.    for a=2000 to 2050
  1428.       if object exist(a)>0 then delete object a
  1429.    next a
  1430.    if object exist(9000)>0
  1431.       delete object 9000
  1432.       delete object 9001
  1433.    endif
  1434.    rem delete enemy and enemy bonus objects
  1435.    for a=200 to 220
  1436.       rem delete enemy object if it exists
  1437.       if object exist(a)>0 then delete object a
  1438.       rem delete enemy bullet object if it exists
  1439.       if object exist(a+50)>0 then delete object a+50
  1440.       rem delete enemy bonus object if it exists
  1441.       if object exist(a+100)>0 then delete object a+100
  1442.    next a
  1443.    rem delete big bonus objects
  1444.    for a=6000 to 6005
  1445.       if object exist(a)>0 then delete object a
  1446.    next a
  1447.    rem delete mini bonus objects
  1448.    for a=7000 to 7100
  1449.       if object exist(a)>0 then delete object a
  1450.    next a
  1451.  
  1452.    rem reset enemy bullet life
  1453.    for a=0 to 15
  1454.        enemy_bullet(a).life=0
  1455.    next a
  1456.  
  1457.    rem get level data start position
  1458.    restore
  1459.    repeat
  1460.       read a$
  1461.    until a$="level "+str$(level_number)
  1462.  
  1463.    rem read level data
  1464.    read level_type
  1465.    read floor_tex_fn$
  1466.    read ceiling_tex_fn$
  1467.    read wall_tex_fn$
  1468.    read platform_border_tex_fn$
  1469.    read platform_floor_tex_fn$
  1470.    read tunnel_tex_fn$
  1471.  
  1472.    rem load level textures
  1473.    load image "media\level\"+ceiling_tex_fn$,1000
  1474.    load image "media\level\"+floor_tex_fn$,1001
  1475.    load image "media\level\"+wall_tex_fn$,1002
  1476.    load image "media\level\"+platform_border_tex_fn$,1003
  1477.    load image "media\level\"+platform_floor_tex_fn$,1004
  1478.    load image "media\level\"+tunnel_tex_fn$,1005
  1479.  
  1480.    rem load level object
  1481.    load object "media\level\level_"+str$(level_type)+".x",1000
  1482.    position object 1000,0+level_offset,0,0
  1483.  
  1484.    if level_type=0
  1485.       rem texture level (limbs 1=ceiling / 2=floor / 3=walls)
  1486.       texture limb 1000,1,1000
  1487.       texture limb 1000,2,1001
  1488.       texture limb 1000,3,1002
  1489.       rem create floor collision zones
  1490.       make static collision box -500+level_offset,-50,-500,500+level_offset,0,500
  1491.       rem create ceiling collision zones
  1492.       make static collision box -500+level_offset,1000,-500,500+level_offset,1050,500
  1493.    endif
  1494.  
  1495.    if level_type=1
  1496.       rem texture level (limbs 1=floor / 2=ceiling / 3=walls / 4=tunnel)
  1497.       texture limb 1000,1,1001
  1498.       texture limb 1000,2,1000
  1499.       texture limb 1000,3,1002
  1500.       texture limb 1000,4,1005
  1501.       rem create floor collision zones
  1502.       make static collision box -500+level_offset,-50,-500,-165+level_offset,0,500
  1503.       make static collision box 165+level_offset,-50,-500,500+level_offset,0,500
  1504.       make static collision box -165+level_offset,-50,-500,165+level_offset,0,-165
  1505.       make static collision box -165+level_offset,-50,165,165+level_offset,0,500
  1506.       rem create ceiling collision zones
  1507.       make static collision box -500+level_offset,1000,-500,-165+level_offset,1050,500
  1508.       make static collision box 165+level_offset,1000,-500,500+level_offset,1050,500
  1509.       make static collision box -165+level_offset,1000,-500,165+level_offset,1050,-165
  1510.       make static collision box -165+level_offset,1000,165,165+level_offset,1050,500
  1511.       rem create mist effect planes
  1512.       make object plain 9000,800,800
  1513.       xrotate object 9000,90
  1514.       position object 9000,level_offset,-410,0
  1515.       texture object 9000,986
  1516.       ghost object on 9000
  1517.       make object plain 9001,800,800
  1518.       xrotate object 9001,90
  1519.       position object 9001,level_offset,-400,0
  1520.       texture object 9001,986
  1521.       ghost object on 9001
  1522.    endif
  1523.  
  1524.    rem create wall collision zones
  1525.    make static collision box -550+level_offset,0,-500,-500+level_offset,1000,500
  1526.    make static collision box 500+level_offset,0,-500,550+level_offset,1000,500
  1527.    make static collision box -500+level_offset,0,-550,500+level_offset,1000,-500
  1528.    make static collision box -500+level_offset,0,500,500+level_offset,1000,550
  1529.  
  1530.    rem create static platforms
  1531.    platform=1001
  1532.    read platform_qty
  1533.    for a=1 to platform_qty
  1534.       read x
  1535.       read y
  1536.       read z
  1537.       read x_size
  1538.       read z_size
  1539.       make object box platform,x_size,30,z_size
  1540.       make object box platform+1,x_size-10,10,z_size-10
  1541.       position object platform,x+level_offset,y,z
  1542.       position object platform+1,x+level_offset,y+10.5,z
  1543.       texture object platform,1003
  1544.       texture object platform+1,1004
  1545.       inc platform,2
  1546.       rem create platform collision zone
  1547.       make static collision box x-(x_size/2)+level_offset,y-16,z-(z_size/2),x+(x_size/2)+level_offset,y+16,z+(z_size/2)
  1548.    next a
  1549.  
  1550.    rem create moving platforms
  1551.    read moving_platform_qty
  1552.    platform=2000
  1553.    for a=0 to moving_platform_qty-1
  1554.       read x_size
  1555.       read z_size
  1556.       read moving_platform(a).waypoint_qty
  1557.       for b=0 to moving_platform(a).waypoint_qty-1
  1558.          read platform_wp_x(a,b)
  1559.          platform_wp_x(a,b)=platform_wp_x(a,b)+level_offset
  1560.          read platform_wp_y(a,b)
  1561.          read platform_wp_z(a,b)
  1562.       next b
  1563.       moving_platform(a).next_waypoint=1
  1564.       make object box platform,x_size,30,z_size
  1565.       make object box platform+1,x_size-10,10,z_size-10
  1566.       texture object platform,1003
  1567.       texture object platform+1,1004
  1568.       make object box platform+2,5,5,5
  1569.       position object platform+2,platform_wp_x(a,0),platform_wp_y(a,0),platform_wp_z(a,0)
  1570.       hide object platform+2
  1571.       make object collision box platform,0-(x_size/2),-15,0-(z_size/2),(x_size/2),15,(z_size/2),0
  1572.       inc platform,3
  1573.    next a
  1574.  
  1575.    rem create enemies
  1576.    read enemy_qty
  1577.    live_enemies=enemy_qty
  1578.    for a=0 to enemy_qty-1
  1579.       enemy(a).object_num=a+200
  1580.       enemy(a).life=1
  1581.       enemy(a).bonus=a
  1582.       enemy(a).ang_y=rnd(359)
  1583.       enemy(a).trapped=0
  1584.       enemy(a).mad=0
  1585.       read enemy_type
  1586.       read enemy(a).pos_x
  1587.       read enemy(a).pos_y
  1588.       read enemy(a).pos_z
  1589.       enemy(a).enemy_type=enemy_type
  1590.       enemy(a).pos_x=enemy(a).pos_x+level_offset
  1591.       rem clockwork baddie setup
  1592.       if enemy_type<3
  1593.          load object "media\characters\baddie_1.x",enemy(a).object_num
  1594.          loop object enemy(a).object_num
  1595.          enemy(a).animation_speed=65
  1596.          set object speed enemy(a).object_num,enemy(a).animation_speed
  1597.          enemy(a).size_x=20
  1598.          enemy(a).size_y=32
  1599.          enemy(a).size_z=20
  1600.          enemy(a).speed=2
  1601.          enemy(a).texture_num=100
  1602.          enemy(a).value=1000
  1603.       endif
  1604.       if enemy_type=3
  1605.          load object "media\characters\baddie_2.x",enemy(a).object_num
  1606.          loop object enemy(a).object_num
  1607.          enemy(a).animation_speed=0
  1608.          enemy(a).size_x=20
  1609.          enemy(a).size_y=32
  1610.          enemy(a).size_z=20
  1611.          enemy(a).speed=2
  1612.          enemy(a).texture_num=102
  1613.          enemy(a).value=2000
  1614.       endif
  1615.       if enemy_type=4 or enemy_type=5
  1616.          load object "media\characters\baddie_3.x",enemy(a).object_num
  1617.          loop object enemy(a).object_num
  1618.          enemy(a).animation_speed=65
  1619.          set object speed enemy(a).object_num,enemy(a).animation_speed
  1620.          enemy(a).size_x=20
  1621.          enemy(a).size_y=32
  1622.          enemy(a).size_z=20
  1623.          enemy(a).speed=2
  1624.          enemy(a).texture_num=104
  1625.          enemy(a).value=1500
  1626.          rem make enemy bullet object
  1627.          make object sphere enemy(a).object_num+50,12
  1628.          texture object enemy(a).object_num+50,987
  1629.          hide object enemy(a).object_num+50
  1630.          make object collision box enemy(a).object_num+50,-5,-5,-5,5,5,5,0
  1631.       endif
  1632.       if enemy_type=6
  1633.          load object "media\characters\baddie_4.x",enemy(a).object_num
  1634.          enemy(a).size_x=20
  1635.          enemy(a).size_y=32
  1636.          enemy(a).size_z=20
  1637.          enemy(a).speed=3
  1638.          enemy(a).texture_num=106
  1639.          enemy(a).value=2000
  1640.          enemy(a).fly_dir=0
  1641.       endif
  1642.       make object collision box enemy(a).object_num,0-(enemy(a).size_x/2),0-(enemy(a).size_y/2),0-(enemy(a).size_z/2),enemy(a).size_x/2,enemy(a).size_y/2,enemy(a).size_z/2,0
  1643.       position object enemy(a).object_num,0+level_offset,1500,0
  1644.    next a
  1645.  
  1646.    rem load bonuses
  1647.    bonus_qty=enemy_qty
  1648.    rem load enemy bonuses
  1649.    for a=0 to bonus_qty-1
  1650.       rem set bonus type to 0 (enemy bonus)
  1651.       bonus(a).bonus_type=0
  1652.       rem apply bonus object number
  1653.       bonus(a).object_num=a+300
  1654.       rem apply a random enemy bonus
  1655.       r=rnd(3)
  1656.       if r=0
  1657.          load object "media\bonuses\bannanas.x",bonus(a).object_num
  1658.          bonus(a).value=100
  1659.       endif
  1660.       if r=1
  1661.          load object "media\bonuses\apple.x",bonus(a).object_num
  1662.          bonus(a).value=200
  1663.       endif
  1664.       if r=2
  1665.          load object "media\bonuses\pumpkin.x",bonus(a).object_num
  1666.          bonus(a).value=300
  1667.       endif
  1668.       if r=3
  1669.          load object "media\bonuses\cherries.x",bonus(a).object_num
  1670.          bonus(a).value=150
  1671.       endif
  1672.       hide object bonus(a).object_num
  1673.    next a
  1674.    rem load level bonuses
  1675.    read level_bonus_qty
  1676.    if level_bonus_qty>0
  1677.       for a=bonus_qty to (bonus_qty+level_bonus_qty)-1
  1678.          read bonus(a).bonus_type
  1679.          rem apply bonus object number
  1680.          bonus(a).object_num=a+300
  1681.          read bonus(a).pos_x
  1682.          bonus(a).pos_x=bonus(a).pos_x+level_offset
  1683.          read bonus(a).pos_y
  1684.          read bonus(a).pos_z
  1685.          bonus(a).life=1
  1686.          if bonus(a).bonus_type=1
  1687.             load object "media/bonuses/gem.x",bonus(a).object_num
  1688.             bonus(a).value=10000
  1689.          endif
  1690.       next a
  1691.       bonus_qty=bonus_qty+level_bonus_qty
  1692.    endif
  1693.    rem load level complete bonuses (8 qty)
  1694.    for a=bonus_qty to (bonus_qty+7)
  1695.       bonus(a).bonus_type=0
  1696.       bonus(a).object_num=a+300
  1697.       rem apply a random level complete bonus
  1698.       r=rnd(3)
  1699.       if r=0
  1700.          load object "media\bonuses\bannanas.x",bonus(a).object_num
  1701.          bonus(a).value=100
  1702.       endif
  1703.       if r=1
  1704.          load object "media\bonuses\apple.x",bonus(a).object_num
  1705.          bonus(a).value=200
  1706.       endif
  1707.       if r=2
  1708.          load object "media\bonuses\pumpkin.x",bonus(a).object_num
  1709.          bonus(a).value=300
  1710.       endif
  1711.       if r=3
  1712.          load object "media\bonuses\cherries.x",bonus(a).object_num
  1713.          bonus(a).value=150
  1714.       endif
  1715.       hide object bonus(a).object_num
  1716.    next a
  1717.    bonus_qty=bonus_qty+8
  1718.  
  1719.    rem position player
  1720.    player.pos_x=-350+level_offset
  1721.    player.pos_y=50
  1722.    player.pos_z=-350
  1723.  
  1724.    rem reset level timers and music
  1725.    level_start_time=timer()
  1726.    if hurry_up<0
  1727.       loop music 1
  1728.       set music speed 1,100
  1729.    endif
  1730.    hurry_up=0
  1731.    end_level=0
  1732.  
  1733. return
  1734.  
  1735. function distance_3d(x1#,x2#,y1#,y2#,z1#,z2#)
  1736.    disx#=x2#-x1#
  1737.    disy#=y2#-y1#
  1738.    disz#=z2#-z1#
  1739.    dis#=abs(sqrt((disx#*disx#)+(disy#*disy#)+(disz#*disz#)))
  1740. endfunction dis#
  1741.  
  1742. menu:
  1743.    if mouseclick()>0 or spacekey()>0
  1744.       center text screen width()/2,screen height()/2,"Get Ready!"
  1745.       sync
  1746.       menu=0
  1747.       player.score=0
  1748.       player.extra_life=100000
  1749.       player.life=3
  1750.       level_number=1
  1751.       gosub new_level
  1752.       show object 1
  1753.       loop music 1
  1754.       set music speed 1,100
  1755.    else
  1756.       rem menu text
  1757.       center text screen width()/2,40,"Bubble Bobble 3D"
  1758.       rem display scoreboard
  1759.       center text screen width()/2,100,"Top Scores"
  1760.       y=140
  1761.       for a=0 to 9
  1762.          center text screen width()/2,y,str$(a+1)+") "+scoreboard_name$(a)+" - "+str$(scoreboard_score(a))
  1763.          inc y,20
  1764.       next a
  1765.       center text screen width()/2,400,"Created in DarkBASIC Professional by Thomas Long"
  1766.       center text screen width()/2,420,"Music by Wendell Norman"
  1767.       rem camera follow enemy
  1768.       camx#=curvevalue(newxvalue(object position x(enemy(enemy_cam).object_num),enemy(enemy_cam).ang_y,-60),camx#,8)
  1769.       camy#=curvevalue(newyvalue(object position y(enemy(enemy_cam).object_num)+50,0,-60),camy#,5)
  1770.       camz#=curvevalue(newzvalue(object position z(enemy(enemy_cam).object_num),enemy(enemy_cam).ang_y,-60),camz#,8)
  1771.       position camera camx#,camy#,camz#
  1772.       point camera newxvalue(object position x(enemy(enemy_cam).object_num),enemy(enemy_cam).ang_y,60),newyvalue(object position y(enemy(enemy_cam).object_num),0,60),newzvalue(object position z(enemy(enemy_cam).object_num),enemy(enemy_cam).ang_y,60)
  1773.    endif
  1774. return
  1775.  
  1776. high_score_entry:
  1777.  
  1778.    rem text entry
  1779.    new$=entry$()
  1780.    for n=1 to len(new$)
  1781.       if asc(mid$(new$,n))=8
  1782.          line$=left$(line$,len(line$)-1)
  1783.       else
  1784.          line$=line$+mid$(new$,n)
  1785.       endif
  1786.    next n
  1787.    clear entry buffer
  1788.  
  1789.    rem display text
  1790.    center text screen width()/2,screen height()/2,"High score! Enter your name."
  1791.    center text screen width()/2,screen height()/2+20,line$
  1792.  
  1793.    rem add score to scoreboard
  1794.    if returnkey()>0
  1795.       for b=9 to high_score-1 step -1
  1796.          scoreboard_name$(b)=scoreboard_name$(b-1)
  1797.          scoreboard_score(b)=scoreboard_score(b-1)
  1798.       next b
  1799.       scoreboard_name$(high_score-1)=line$
  1800.       scoreboard_score(high_score-1)=player.score
  1801.       high_score=0
  1802.       menu=1
  1803.       remstart save scoreboard to file
  1804.       if file exist("scores.dat") then delete file "scores.dat"
  1805.       open to write 1,"scores.dat"
  1806.          for a=0 to 9
  1807.             write string 1,scoreboard_name$(a)
  1808.             write file 1,scoreboard_score(a)
  1809.          next a
  1810.       close file 1
  1811.       remend
  1812.    endif
  1813.  
  1814. return
  1815.